package cn.tedu.csmall.product.service.impl;

import cn.tedu.csmall.commons.ex.ServiceException;
import cn.tedu.csmall.commons.web.ServiceCode;
import cn.tedu.csmall.product.mapper.SkuMapper;
import cn.tedu.csmall.product.mapper.SpuMapper;
import cn.tedu.csmall.product.pojo.entiry.Sku;
import cn.tedu.csmall.product.pojo.param.SkuAddNewParam;
import cn.tedu.csmall.product.pojo.param.SkuUpdateInfoParam;
import cn.tedu.csmall.product.pojo.vo.SkuStandardVO;
import cn.tedu.csmall.product.pojo.vo.SpuStandardVO;
import cn.tedu.csmall.product.service.ISkuService;
import cn.tedu.csmall.product.util.IdUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;


/**
 * csmall-server-jh
 * <p>
 * SKU接口的实现类
 *
 * @author: 姜衡
 * @create: 2024-10-06 10:01
 **/

@Slf4j
@Service
public class SkuServiceImpl implements ISkuService {

    @Value("${csmall.crud.default-query-page-size}")
    private Integer defaultQueryPageSize;
    @Autowired
    private SpuMapper spuMapper;
    @Autowired
    private SkuMapper skuMapper;
    @Autowired
    private IdUtils idUtils;


    @Override
    public void addNew(SkuAddNewParam skuAddNewParam) {
        log.debug("开始【新增SKU】的业务，参数：{}", skuAddNewParam);

        // 检查该SKU对应的SPU是否存在，若不存在，则抛出异常
        SpuStandardVO spu = spuMapper.getStandard(skuAddNewParam.getSpuId());
        if (spu == null) {
            String message = "新增SKU失败，对应的SPU不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 新增SKU
        // 设置ID
        long spuId = idUtils.generateSpuId();
        Sku sku = new Sku();
        BeanUtils.copyProperties(skuAddNewParam, sku);
        sku.setId(spuId);
        // 补全属性值
        sku.setAttributeTemplateId(spu.getAttributeTemplateId());
        sku.setAlbumId(spu.getAlbumId());
        sku.setPictures(spu.getPictures());
        sku.setCommentCount(spu.getCommentCount());
        sku.setPositiveCommentCount(spu.getPositiveCommentCount());
        sku.setSales(spu.getSales());
        sku.setGmtCreate(LocalDateTime.now());
        sku.setGmtModified(LocalDateTime.now());
        int rows = skuMapper.insert(sku);
        if (rows != 1) {
            String message = "新增SKU失败，服务器正忙，请稍后再试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
        log.debug("新增SKU完成！");
    }

    @Override
    public void delete(Long id) {
        log.debug("开始处理【根据id删除SKU】的业务，参数ID:{}", id);

        // 检查SKU是否存在，若不存在，则抛出异常
        SkuStandardVO skuStandard = skuMapper.getStandard(id);
        if (skuStandard == null) {
            String message = "删除SKU失败，SKU数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 检查对应的SKU是否存在，若不存在，则抛出异常
        SpuStandardVO spuStandard = spuMapper.getStandard(skuStandard.getSpuId());
        if (spuStandard == null) {
            String message = "删除SKU失败，SKU对应的SPU数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 执行删除
        int rows = skuMapper.deleteById(id);
        if (rows != 1) {
            String message = "删除SKU失败，服务器正忙，请稍后再试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_DELETE, message);
        }
        log.debug("SKU删除完成！");
    }

    @Override
    public void update(Long id, SkuUpdateInfoParam skuUpdateInfoParam) {
        log.debug("开始处理【根据id更新SKU】的业务，更新数据：{}", skuUpdateInfoParam);

        // 检查SKU是否存在，若不存在，则抛出异常
        SkuStandardVO skuStandard = skuMapper.getStandard(id);
        if (skuStandard == null) {
            String message = "修改SKU失败，SKU数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 检查对应的SKU是否存在，若不存在，则抛出异常
        SpuStandardVO spuStandard = spuMapper.getStandard(skuStandard.getSpuId());
        if (spuStandard == null) {
            String message = "修改SKU失败，SKU对应的SPU数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        // 执行修改
        Sku sku = new Sku();
        BeanUtils.copyProperties(skuUpdateInfoParam, sku);
        sku.setId(id);
        sku.setGmtModified(LocalDateTime.now());
        int rows = skuMapper.updateById(sku);
        if (rows != 1) {
            String message = "修改SKU失败，服务器正忙，请稍后再试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
        log.debug("修改SKU完成!");
    }

    @Override
    public SkuStandardVO getStandard(Long id) {
        log.debug("开始处理【根据id获取SKU标准数据】的业务，参数ID：{}，", id);

        SkuStandardVO standard = skuMapper.getStandard(id);
        if (standard == null) {
            String message = "根据id获取SKU标准数据失败，数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        log.debug("查询完成，即将返回的数据：{}", standard);
        return standard;
    }
}
